package com.example.webrestfulcrud.exception;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.web.servlet.error.ErrorAttributes;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.servlet.ModelAndView;

import javax.servlet.RequestDispatcher;
import javax.servlet.http.HttpServletRequest;
import java.util.HashMap;
import java.util.Map;

@ControllerAdvice
public class MyUserNotExistExceptionHandler {

    public static final String MY_ERROR_MAP = "myErrorMap";


    /**
     * 自定义的异常处理器，将要渲染到错误视图的属性放在request中，
     * 方式一、再请求转发到自定义的错误Controller，完成解析错误视图并渲染到视图上
     * 方式二、通过自定义的 ErrorAttributes ，从request中取出这里放入的对象，再返回给springBoot 自带的 BasicErrorController，将属性发送到模版引擎
     * @param e
     * @return
     */
    @ExceptionHandler(UserNotExistException.class)
    public String handleUserNotExistException(Exception e, HttpServletRequest req) {
        Map<String, Object> map = new HashMap<>();
        /**
         * 主要：需要传入我们自己的错误状态码，否则 BasicErrorController 解析到的错误状态码是200，就不能跳转我们自定义的错误页面
         *
         * RequestDispatcher.ERROR_STATUS_CODE = "javax.servlet.error.status_code";
         * Integer statusCode = (Integer) request.getAttribute(RequestDispatcher.ERROR_STATUS_CODE);
         *
         * */
        req.setAttribute(RequestDispatcher.ERROR_STATUS_CODE, 404);

        map.put("code", "500plus");
        map.put("customizedMessage", "用户名不存在");

        req.setAttribute(MY_ERROR_MAP,map);
        /**
         * 交给 BasicErrorController 解析自适应客户端还是浏览器
         */
        return "forward:/error";
    }


    /**
     * 自适应（浏览器返回网页，客户端返回json，就像BasicErrorController的errorHtml()和error()方法一样）
     * 缺点：不能跳转到自定义的错误页面，原因是没有解析到状态码，再根据状态码200解析不到4xx,5xx的错误页面
     * 因为状态码变成了200
     *
     * @param e
     * @return
     */
    //@ExceptionHandler(UserNotExistException.class)
    public String handleUserNotExistException2(Exception e, HttpServletRequest req) {
        Map<String, String> map = new HashMap<>();
        /**
         * 主要：需要传入我们自己的错误状态码，否则 BasicErrorController 解析到的错误状态码是200，就不能跳转我们自定义的错误页面
         *
         * RequestDispatcher.ERROR_STATUS_CODE = "javax.servlet.error.status_code";
         * Integer statusCode = (Integer) request.getAttribute(RequestDispatcher.ERROR_STATUS_CODE);
         *
         * */
        req.setAttribute(RequestDispatcher.ERROR_STATUS_CODE, 404);

        map.put("code", "500plus");
        map.put("message", "用户名不存在");


        /**
         * 交给 BasicErrorController 解析自适应客户端还是浏览器
         */
        return "forward:/error";
    }


    /**
     * 捕获抛出的异常并且返回json数据
     * 不能往Model中添加数据，否则添加的数据无效
     * 这样写死之后，浏览器和客户端收到的都只有json数据
     * @param e
     * @return
     */
/*    @ExceptionHandler(UserNotExistException.class)
    @ResponseBody
    public Map<String, String> handleUserNotExistException(Exception e){
        Map<String, String> map = new HashMap<>();
        map.put("code","500plus");
        map.put("message","用户名不存在");
        return map;
    }*/

}
